package logica.mensajes;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;

import electro.Electrocardiograma;
import electro.Muestra;
import electro.Toma;

import logica.Enfermero;
import logica.Paciente;

import red.MsjNotForMeException;

public class MensajeDatos extends Mensaje {

	private Enfermero 		   enfermero;
	private Paciente 		   paciente; 		// Contiene "Vista Previa Mensaje"
	private Electrocardiograma electro;
	
	// Constructores
	
	public MensajeDatos(int id_msj, int id_origen, int id_destino, 
			String cuerpo, Enfermero enfermero, Paciente paciente,
			Electrocardiograma electro) {
		
		this.id_msj = id_msj;
		this.id_origen = id_origen;
		this.id_destino = id_destino;
		this.cuerpo = cuerpo;
		this.enfermero = enfermero;
		this.paciente = paciente;
		this.electro = electro;
		this.tipo = "DATO";
	}
	
	
	public MensajeDatos(int id_msj, int id_origen, String cuerpo,
			InetAddress ip_origen) {
		super();
		this.id_msj    = id_msj;
		this.id_origen = id_origen;
		this.cuerpo    = cuerpo;
		this.tipo      = "DATO";
	}

	
	// Enfermero, Paciente, Electro
	
	public MensajeDatos() {
		enfermero  = new Enfermero();
		paciente   = new Paciente(); 		// Contiene "Vista Previa Mensaje"
	}

	public Enfermero getEnfermero() {
		return enfermero;
	}

	public Paciente getPaciente() {
		return paciente;
	}

	public Electrocardiograma getElectro() {
		return electro;
	}

	public void setEnfermero(Enfermero enfermero) {
		this.enfermero = enfermero;
	}

	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}

	public void setElectro(Electrocardiograma electro) {
		this.electro = electro;
	}

	
	public byte[] toByte() throws IOException{
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		DataOutputStream out = new DataOutputStream(byteStream);
		
		byte[] msj_base_data = super.toByte();
		out.write(msj_base_data);
		
		// Datos enfermero
		out.writeInt(enfermero.getId());
				
		// Datos Paciente
		out.writeUTF(paciente.getNombre());
		out.writeUTF(paciente.getApellido());
		out.writeInt(paciente.getDNI());
		out.writeInt(paciente.getEdad());
		out.writeUTF(paciente.getSexo());
		
		out.writeFloat(paciente.getTemperatura()); // Temp
		out.writeInt(paciente.getPresion_sistolica());   // Sistolica
		out.writeInt(paciente.getPresion_distolica());   // Diastolica
		out.writeInt(paciente.getFrecuencia_resp());  // Frecuencia Respiratoria
		out.writeInt(paciente.getPpm());   // PPM
		out.writeInt(paciente.getGlucosa_en_sangre());
		out.writeInt(paciente.getOxigeno_en_sangre());
		
		// Electrocardiograma u otros estudios
		int c_tomas = electro.cant_tomas();
		int c_muestras = 0;
		for (int x=0;x<c_tomas;x++){
			Toma toma = electro.da_toma(x);
			c_muestras = toma.cant_muestras(); 
			out.writeInt(c_muestras);
			
			int mues;
			
			for(int i=0;i<c_muestras;i++){
				mues = toma.da_muestra(i).getMedicion();
				out.writeInt(mues);
			}
		}
		
		out.flush();
		out.close();
		
		return byteStream.toByteArray();
	}
	
	public static MensajeDatos fromByte(byte[] input) throws IOException, MsjNotForMeException{
		ByteArrayInputStream bs = new ByteArrayInputStream(input);
		DataInputStream in      = new DataInputStream(bs);
		MensajeDatos msj        = new MensajeDatos();
		
		String string_verif = in.readUTF(); 
		if(!string_verif.equals("SAER"))
			throw new MsjNotForMeException();
		
		in.readUTF();						// Lee el tipo, pero no hago nada
		msj.setIDmensaje(in.readInt()); 	// ID msj
		msj.setIDorigen(in.readInt());		// ID org		
		msj.setIDdestino(in.readInt());     // ID dest
		msj.setCuerpo(in.readUTF());
		
		// Datos enfermero
		msj.getEnfermero().setId(in.readInt());
		
		// Datos Paciente
		msj.getPaciente().setNombre(in.readUTF());
		msj.getPaciente().setApellido(in.readUTF());
		msj.getPaciente().setDNI(in.readInt());
		msj.getPaciente().setEdad(in.readInt());
		msj.getPaciente().setSexo(in.readUTF());
		
		msj.getPaciente().setTemperatura(in.readFloat());   // Temp
		msj.getPaciente().setPresion_sistolica(in.readInt()); // Sistolica
		msj.getPaciente().setPresion_distolica(in.readInt()); // Diastolica
		msj.getPaciente().setFrecuencia_resp(in.readInt());
		msj.getPaciente().setPpm(in.readInt());
		msj.getPaciente().setGlucosa_en_sangre(in.readInt());
		msj.getPaciente().setOxigeno_en_sangre(in.readInt());
		
		// Electrocardiograma 
		Electrocardiograma e = new Electrocardiograma();
		
		// Toma 1
		Toma toma = new Toma();
		int c_muestras = in.readInt();
		int muestra = 0;
		
		for(int i=0;i<c_muestras;i++){
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));			
		}
		e.agregar_toma(toma);
		
		
		// Toma 2
		toma = new Toma();
		c_muestras = in.readInt();
		muestra = 0;
		
		for(int i=0;i<c_muestras;i++){
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));			
		}
		e.agregar_toma(toma);
		
		// Toma 3
		toma = new Toma();
		c_muestras = in.readInt();
		muestra = 0;

		for(int i=0;i<c_muestras;i++){
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));			
		}
		e.agregar_toma(toma);
		
		msj.setElectro(e);	
		
		return msj;
	}

}
